<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

    <title>葡萄藤PPT</title>

    <link rel="stylesheet" href="../css/reveal/reveal.css">

    <!-- PPT主题，可以在/css/reveal/theme/中选择其他主题，目前暂时只能使用该模板 -->
    <link rel="stylesheet" href="../css/reveal/theme/ptt.css">

    <!-- syntax highlighting 代码高亮主题 -->
    <link rel="stylesheet" href="../lib/reveal/css/zenburn.css">

    <!-- 打印和PDF输出样式 -->
    <script>
        var link = document.createElement('link');
        link.rel = 'stylesheet';
        link.type = 'text/css';
        link.href = window.location.search.match(/print-pdf/gi) ? '../css/reveal/print/pdf.css' : '../css/reveal/print/paper.css';
        document.getElementsByTagName('head')[0].appendChild(link);
    </script>
    <style type="text/css">
        h3 {
            font-family: 'Microsoft Yahei';
        }

        p {
            font-size: 30px !important;
            letter-spacing: 2px;
            line-height: 50px !important;
            text-align: left;
        }

        B {
            color: rgb(195, 255, 219);
            font-size: 40px !important;
            font-weight: 500 !important;
        }

        a {
            color: #fff !important;
        }
    </style>
</head>
<body>
<img src="../img/demo/logo.png" alt="" usemap="#pttmap" class="base-logo">
<map name="pttmap">
    <area shape="rect" coords="0,0,276,58" href="http://www.jnshu.com" alt="" target="_blank"/>
</map>
<div class="reveal">
    <div class="slides">
        <section>
            <h2>【JS-task4】</h2>

            <h3>闭包是什么？用处如何？</h3>

            <h3>小课堂</h3>

            分享人：钟楚炯
        </section>
        <section>
            <p style="text-align: center;">目录</p>
            <p style="text-align: center;">1.背景介绍</p>
            <p style="text-align: center;">2.知识剖析</p>
            <p style="text-align: center;">3.常见问题</p>
            <p style="text-align: center;">4.解决方案</p>
            <p style="text-align: center;">5.编码实战</p>
            <p style="text-align: center;">6.扩展思考</p>
            <p style="text-align: center;">7.参考文献</p>
            <p style="text-align: center;">8.更多讨论</p>
        </section>
        <!--1.背景介绍-->
        <section>
            <section>
                <h3>1.背景介绍</h3>
            </section>
            <section>
                <p>闭包是JS语言的一个特色，也是一个难点，很多高级应用中都要依赖闭包实现。</p>
                <p>一言蔽之，闭包就是：「函数」和「函数内部能访问到的变量」（也叫环境）的总和。</p>
               </section>
        </section>
        <!--2.知识剖析-->
        <section>
            <h3>2.知识剖析</h3>
        </section>
        <!--2.1 JS有哪些数据类型？-->
        <section>
            <section><B>2.1 闭包到底是什么？</B></section>
            <section>
                <p>高程上的解释是：</p>
                <p>闭包是指<b>有权访问另一个函数作用域中的变量的函数</b>.</p>
            </section>
            <section>
                <p>我们把定语去掉可以得出，闭包实际上就是一个函数，但是还有一个特点，就是它可以访问另一个函数作用域中的变量。</p>
                <p>所以闭包是由两部分组成：【函数】和【函数可以访问到的变量】</p>
            </section>
            <section>
                <pre>
                    <code>
                        function foo(){
                            var local = '变量';
                            function a(){
                                console.log(local);
                            }
                        }

                    </code>
                </pre>
            </section>
        </section>
        <!--3.常见问题-->
        <section>
            <h3>3.常见问题</h3>
        </section>
        <section>
            <b>闭包有什么作用？</b>
        </section>
        <!--4.解决方案-->
        <section>
            <h3>4.解决方案</h3>
        </section>
        <section>
            <section>
                <p>闭包常常用来「间接访问一个变量」。换句话说，「隐藏一个变量」。</p>
            </section>
            <section>
                <p>举个粟子，当我们定义了一个变量，想要调用它，但又想隐藏起来不被别人无意修改到怎么做？</p>
                <pre>
                    <code>
                        function foo(){
                          var name = '狗蛋';
                          return function (){
                            return name;
                          }
                        }
                        var a = foo();
                        a();
                    </code>
                </pre>
            </section>
            <section>
                <p>那问题来了，我们都知道在函数作用域链中，内部作用域可以访问外部的作用域，外部的作用域无法访问内部的作用域。</p>
                <p>但在这个例子中，函数foo里声明的变量为什么可以在外部访问到呢？</p>
            </section>
            <section>
                <p>当某个函数被调用时，会创建一个执行环境，及相应的作用域链。无论什么时候在函数中访问一个变量时，就会从作用域中搜索具有相应名字的变量。</p>
                <p>一般来说，当函数执行完毕之后，局部活动对象就会被毁，内存中仅保存全局作用域，但是，闭包情况又有不同。</p>
                <p>比如上述函数foo，在执行完毕之后，活动对象不会被销毁，因为匿名函数的作用域仍然在引用这个活动对象。要直到匿名函数被销毁后，函数foo的活动对象才会被销毁。</p>
            </section>
        </section>
        <!--5.编码实战-->
        <section>
            <h3>5.编码实战</h3>
        </section>
        <!--6.拓展思考-->
        <section>
            <h3>6.拓展思考</h3>
        </section>
        <section>
            <B>闭包是否会造成内存泄露？</B>
        </section>
        <section>
            <p>
                所谓的内存泄露是指你用不到（访问不到）的变量，依然占居着内存空间，不能被再次利用起来。
                但闭包里面的变量就是我们需要的变量，所以说闭包不会造成内存泄露。
                这个谣言是如何来的？
                因为IE 有 bug，IE 在我们使用完闭包之后，依然回收不了闭包里面引用的变量。所以导致了内存泄露。
                但这是是 IE 的问题，不是闭包的问题。
            </p>
        </section>
        <section>
            <h3>7.参考文献</h3>
            <section>
                <a href="https://zhuanlan.zhihu.com/p/26899840" target="_blank">js 闭包、常见认识误区与主要应用</a>
            </section>
        </section>
        <section>
            <h3>8.更多讨论</h3>
        </section>
        <section>
            <p style="text-align: center">感谢大家观看
            <p style="text-align: center">
                <small>BY : 钟楚炯</small>
        </section>
        <script src="../lib/reveal/js/head.min.js"></script>
        <script src="../lib/reveal/reveal.js"></script>
    </div>
</div>
<script>
    // 以下为常见配置属性的默认值
    // {
    // 	controls: true, // 是否在右下角展示控制条
    // 	progress: true, // 是否显示演示的进度条
    // 	slideNumber: false, // 是否显示当前幻灯片的页数编号，也可以使用代码slideNumber: 'c / t' ，表示当前页/总页数。
    // 	history: false, // 是否将每个幻灯片改变加入到浏览器的历史记录中去
    // 	keyboard: true, // 是否启用键盘快捷键来导航
    // 	overview: true, // 是否启用幻灯片的概览模式，可使用"Esc"或"o"键来切换概览模式
    // 	center: true, // 是否将幻灯片垂直居中
    // 	touch: true, // 是否在触屏设备上启用触摸滑动切换
    // 	loop: false, // 是否循环演示
    // 	rtl: false, // 是否将演示的方向变成RTL，即从右往左
    // 	fragments: true, // 全局开启和关闭碎片。
    // 	autoSlide: 0, // 两个幻灯片之间自动切换的时间间隔（毫秒），当设置成 0 的时候则禁止自动切换，该值可以被幻灯片上的 ` data-autoslide` 属性覆盖
    // 	transition: 'default', // 切换过渡效果，有none/fade/slide/convex/concave/zoom
    // 	transitionSpeed: 'default', // 过渡速度，default/fast/slow
    // 	mouseWheel: true, //是否启用通过鼠标滚轮来切换幻灯片
    // }
    // 初始化幻灯片
    Reveal.initialize({
        history: true,
        dependencies: [
            {src: '../plugin/markdown/marked.js'},
            {src: '../plugin/markdown/markdown.js'},
            {src: '../plugin/notes/notes.js', async: true},
            {src: '../plugin/highlight/highlight.js', async: true, callback: function () {
                    hljs.initHighlightingOnLoad();
                }
            }
        ]
    });
</script>
</body>
</html>
